/* Copyright (C) 2021 Rain */

/* This file is part of XNIX. */

/* 
  XNIX is free software: you can redistribute it and/or modify 
  it under the terms of the GNU General Public License as published by 
  the Free Software Foundation, either version 3 of the License, or 
  (at your option) and later version. 
*/

/*
  XNIX is distributed in the hope that it will be useful, 
  but WITHOUT ANY WARRANTY; without even the implied warranty of 
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
  GNU General Public License for more details. 
*/

/*
  You should have received a copy of the GNU General Public License 
   along with XNIX. If not, see <https://www.gnu.org/licenses/>.  
*/




#ifndef _STRING_H
#define _STRING_H


/* now you're saying loudly... */


/* copy src to dest for n bytes */
#define memcpy(dest, src, n) ({ \
	__asm__ __volatile__ ( \
		"cld\n\t" \
		"rep movsb\n\t" \
		:: "c" (n), "S" (src), "D" (dest) \
	); \
	dest; \
})


/* set n to src for n bytes */
#define memset(dest, c, n) ({ \
	__asm__ __volatile__ ( \
		"cld\n\t" \
		"rep stosb\n\t" \
		:: "c" (n), "D" (dest), "a" (c) \
	); \
	dest; \
})


#endif

